package com.jxt.myjxtmanager.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.ArrayList;
import java.util.List;

/**
 * 数据适配器抽象基类
 *
 * @param <T> 列表数据类型
 * @param <H> 列表项视图辅助类
 * @author lkk
 */
public abstract class BaseQuickAdapter<T, H extends BaseAdapterHelper>
        extends
        BaseAdapter {
    protected static final String TAG = BaseQuickAdapter.class.getSimpleName();
    /**
     * 上下文对象
     */
    protected final Context mContext;
    /**
     * 列表项布局资源Id
     */
    protected int mLayoutId;
    /**
     * 列表数据
     */
    protected final List<T> mDatas;

    public BaseQuickAdapter(Context context, int layoutId) {
        this(context, layoutId, null);
    }

	public BaseQuickAdapter(Context context, int layoutId, List<T> datas) {
		this.mContext = context;
		this.mDatas = datas == null ? new ArrayList<T>() :datas;
		this.mLayoutId = layoutId;
	}

    @Override
    public int getCount() {
        return mDatas.size();
    }

    @Override
    public T getItem(int position) {
        return mDatas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final H helper = getAdapterHelper(position, convertView, parent);
        T item = getItem(position);
        convert(helper, item);
        return helper.getView();

    }

    /**
     * 添加数据
     *
     * @param item 数据项
     */
    public void add(T item) {
        mDatas.add(item);
        notifyDataSetChanged();
    }

    /**
     * 插入数据
     *
     * @param index 要插入的索引位置
     * @param item  数据项
     */
    public void insertAt(int index, T item) {
        mDatas.add(index, item);
        notifyDataSetChanged();
    }

    /**
     * 添加一个数据集合
     *
     * @param items 数据集合
     */
    public void addAll(List<T> items) {
        if (items == null || items.size() == 0) {
            return;
        }

        mDatas.addAll(items);
        notifyDataSetChanged();
    }

    /**
     * 更新数据项
     *
     * @param oldItem 旧数据项
     * @param newItem 新数据项
     */
    public void set(T oldItem, T newItem) {
        set(mDatas.indexOf(oldItem), newItem);
    }

    /**
     * 设置某个索引位置处的数据项
     *
     * @param index 索引位置
     * @param item  要放置到该位置处的数据项
     */
    public void set(int index, T item) {
        mDatas.set(index, item);
        notifyDataSetChanged();
    }

    /**
     * 移除某个数据项
     *
     * @param item 要移除的数据项
     */
    public void remove(T item) {
        boolean isRemoveSuccess = mDatas.remove(item);
        if (isRemoveSuccess) {
            notifyDataSetChanged();
        }
    }

    /**
     * 移除某个索引位置处的数据项
     *
     * @param index 要移除的数据项的索引位置,请保证索引没有越界
     */
    public void remove(int index) {
        mDatas.remove(index);
        notifyDataSetChanged();
    }

    /**
     * 替换所有的数据项
     *
     * @param items 要替换成的数据项集合
     */
    public void replaceAll(List<T> items) {
        mDatas.clear();
        addAll(items);
    }

    /**
     * 判断是否包含某个数据项
     *
     * @param item 要进行包含判断的数据项
     * @return true包含, false不包含
     */
    public boolean contains(T item) {
        return mDatas.contains(item);
    }

    /**
     * 清空所有数据
     */
    public void clear() {
        mDatas.clear();
        notifyDataSetChanged();
    }

    /**
     * 将相应的数据显示到视图上
     *
     * @param helper 列表项视图辅助类
     * @param item   列表项对应的数据
     */
    protected abstract void convert(H helper, T item);

    /**
     * 重写该方法,并返回一个自定义的BaseAdapterHelper对象
     *
     * @param position    数据索引位置
     * @param convertView 可复用的列表项视图,需要检查是否为null,如果为null或者类型不正确,该方法需要重写创建一个view
     * @param parent      该列表项所属的父布局
     * @return 返回一个BaseAdapterHelper对象
     */
    protected abstract H getAdapterHelper(int position, View convertView,
                                          ViewGroup parent);

}
